﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using Datos;

namespace Negocio
{
    public class ArticuloComponente : Base
    {

        #region Constantes

        const string ERR_SOURCE = "Cliente";
        const string USUARIO_LOGIN = "usuarioLogin";

        #endregion

        #region Atributos y Propiedades

        private string ArticuloId;

        public string _articuloId
        {
            get { return ArticuloId; }
            set { ArticuloId = value; }
        }
        private string ComponenteId;

        public string _ComponenteId
        {
            get { return ComponenteId; }
            set { ComponenteId = value; }
        }

        private Articulo _articulo;
        public Articulo Articulo
        {
            get { return _articulo; }
            set { _articulo = value; }
        }

        private Articulo _articuloComponente;
        public Articulo ArticuloComponente1
        {
            get { return _articuloComponente; }
            set { _articuloComponente = value; }
        }

        private int _cantidad;
        public int Cantidad
        {
            get { return _cantidad; }
            set { _cantidad = value; }
        }

        #endregion


        #region Acceso a Datos

        protected override bool LeerDB()
        {
            bool existe = false;
            object[] parametros = {_articulo,null,null };
            IDataReader dr = DatosOleDb.DB().ObtenerDataReader("ArticuloComponenteSFiltro", parametros);
            if (dr.Read())
            {
                CargarDR(dr);
                existe = true;
            }
            dr.Close();
            return existe;
        }

        protected override void InsertDB()
        {
            object[] parametros = new object[] { _articulo,_articuloComponente,_cantidad};
            DatosOleDb.DB().TxBegin();
            try
            {
                DatosOleDb.DB().EnviarDatos("ArticuloComponenteI", ref parametros);
                DatosOleDb.DB().TxCommit();
            }
            catch (System.Data.OleDb.OleDbException)
            {
                DatosOleDb.DB().TxRollback();
                DatosException ex = new DatosException("Ya Esta Agregado el componente: " + _articuloComponente, ERR_SOURCE);
                throw ex;
            }
            catch (Exception)
            {
                DatosOleDb.DB().TxRollback();
                throw;
            }
        }

        protected override void UpdateDB()
        {
            object[] parametros = new object[] { _articulo,_articuloComponente,_cantidad};
            DatosOleDb.DB().TxBegin();
            try
            {
                DatosOleDb.DB().EnviarDatos("ArticuloComponenteU", ref parametros);
                DatosOleDb.DB().TxCommit();
            }
            catch (System.Data.OleDb.OleDbException)
            {
                DatosOleDb.DB().TxRollback();
                DatosException ex = new DatosException("No se puede actualizar la estructura del artciulo " + _articuloComponente, ERR_SOURCE);
                throw ex;
            }
            catch (Exception)
            {
                DatosOleDb.DB().TxRollback();
                throw;
            }
        }

        protected override void DeleteDB()
        {
            object[] parametros = new object[] { _articulo, _articuloComponente };
            DatosOleDb.DB().TxBegin();
            try
            {
                DatosOleDb.DB().EnviarDatos("ArticuloComponenteD", ref parametros);
                DatosOleDb.DB().TxCommit();
            }
            catch (Exception)
            {
                DatosOleDb.DB().TxRollback();
                throw;
            }
        }

        protected override void CargarDR(IDataReader dr)
        {
            _articuloId = dr["articuloId"].ToString();
            _ComponenteId = dr["articuloComponenteID"].ToString();
            _cantidad = Convert.ToInt32(dr["cantidad"].ToString());

            SetClave(USUARIO_LOGIN, dr[USUARIO_LOGIN]);
            MarcarViejo();
        }

        public override void Validar()
        {
            InconsistenciaException ex = new InconsistenciaException();
            ex.Source = ERR_SOURCE;
            if (_articulo == null) ex.AgregarError("Dato requerido", "articuloid");
            if (_articuloComponente == null) ex.AgregarError("Dato requerido", "articulocomponenteID");            
            ex.Lanzar();
        }

        #endregion

        #region Metodos estaticos de clase

        public static ArticuloComponente ObtenerPorCodigo(string articulo, string componente)
        {
            ArticuloComponente obj = new ArticuloComponente();
            obj._articuloId = articulo;
            obj._ComponenteId = componente;
            if (obj.LeerDB())
            {
                return obj;
            }
            else
            {
                return null;
            }
        }

        public static List<ArticuloComponente> ObtenerTodos()
        {
            ArticuloComponente obj;
            List<ArticuloComponente> lista = new List<ArticuloComponente>();
            object[] parametros = { null, null, null};
            IDataReader dr;
            dr = DatosOleDb.DB().ObtenerDataReader("ArticuloComponenteSFiltro", parametros);
            while (dr.Read())
            {
                obj = new ArticuloComponente();
                obj.CargarDR(dr);
                lista.Add(obj);
            }
            dr.Close();
            return lista;
        }

        public static List<ArticuloComponente> ObtenerPorFiltro(string articulo, string componente)
        {
            ArticuloComponente obj;
            List<ArticuloComponente> lista = new List<ArticuloComponente>();
            object[] parametros = { articulo, componente, null };
            IDataReader dr;
            dr = DatosOleDb.DB().ObtenerDataReader("ArticuloComponenteSFiltro", parametros);
            while (dr.Read())
            {
                obj = new ArticuloComponente();
                obj.CargarDR(dr);
                lista.Add(obj);
            }
            dr.Close();
            return lista;
        }
        #endregion
    }
}
